home *** CD-ROM | disk | FTP | other *** search
/ Workbench Add-On / Workbench Add-On - Volume 1.iso / Dev / Oberon / examples.lha / Examples / Oberon0 / GraphicFrames0.Mod < prev    next >
Encoding:
Text File  |  1995-04-15  |  2.8 KB  |  96 lines

  1. MODULE GraphicFrames0;  (*HM Mar-25-92*)
  2. IMPORT OS, Viewers0, Shapes0;
  3.  
  4. TYPE
  5.   Frame* = POINTER TO FrameDesc;
  6.   FrameDesc* = RECORD (Viewers0.FrameDesc)
  7.     orgX*, orgY*: INTEGER;  (*origin*)
  8.     graphic*: Shapes0.Graphic  (*shapes in this frame*)
  9.   END;
  10.  
  11. PROCEDURE (f: Frame) InvertBlock* (x, y, w, h: INTEGER);
  12. BEGIN
  13.   INC(x, f.x + f.orgX); INC(y, f.y + f.orgY);
  14.   IF x < f.x THEN DEC(w, f.x - x); x := f.x END;
  15.   IF x + w > f.x + f.w THEN w := f.x + f.w - x END;
  16.   IF y < f.y THEN DEC(h, f.y - y); y := f.y END;
  17.   IF y + h > f.y + f.h THEN h := f.y + f.h - y END;
  18.   IF (w > 0) & (h > 0) THEN OS.InvertBlock(x, y, w, h) END
  19. END InvertBlock;
  20.  
  21. PROCEDURE (f: Frame) Draw*;
  22. BEGIN OS.FadeCursor;
  23.   OS.EraseBlock(f.x, f.y, f.w, f.h);
  24.   f.graphic.Draw(f)
  25. END Draw;
  26.  
  27. PROCEDURE (f: Frame) Modify* (y: INTEGER);
  28. BEGIN f.Modify^ (y); f.Draw
  29. END Modify;
  30.  
  31. PROCEDURE (f: Frame) HandleMouse* (x, y: INTEGER; buttons: SET);
  32.   VAR w, h, dx, dy: INTEGER; obj: OS.Object; s: Shapes0.Shape; changed: BOOLEAN;
  33.  
  34.     PROCEDURE Track(VAR x, y, w, h, dx, dy: INTEGER; VAR buttons: SET);
  35.       VAR b: SET; x1, y1: INTEGER;
  36.     BEGIN
  37.       REPEAT
  38.         OS.GetMouse(b, x1, y1); buttons := buttons + b;
  39.         OS.DrawCursor(x1, y1)
  40.       UNTIL b = {};
  41.       dx := x1 - x; dy := y1 - y; w := ABS(dx); h := ABS(dy);
  42.       IF x1 < x THEN x := x1 END;
  43.       IF y1 < y THEN y := y1 END;
  44.       DEC(x, f.x + f.orgX); DEC(y, f.y + f.orgY) (*convert to frame coordinates*)
  45.     END Track;
  46.  
  47. BEGIN
  48.   changed := FALSE;
  49.   IF OS.left IN buttons THEN Track(x, y, w, h, dx, dy, buttons);
  50.     (*generate new shape with type curShape*)
  51.     OS.NameToObj(Shapes0.curShape, obj);
  52.     IF obj # NIL THEN
  53.       s := obj(Shapes0.Shape); s.SetBox(x, y, w, h); f.graphic.Insert(s)
  54.     END
  55.   ELSIF OS.middle IN buttons THEN Track(x, y, w, h, dx, dy, buttons);
  56.     IF OS.left IN buttons THEN (*MM+ML click: move selected figures*)
  57.       f.graphic.MoveSelected(dx, dy)
  58.     ELSE (*MM click: move origin*)
  59.       INC(f.orgX, dx); INC(f.orgY, dy); f.Draw
  60.     END
  61.   ELSIF OS.right IN buttons THEN
  62.     f.Neutralize; Track(x, y, w, h, dx, dy, buttons);
  63.     f.graphic.SetSelection(x, y, w, h);
  64.     IF OS.left IN buttons THEN (*MR+ML click: delete selected shapes*)
  65.       f.graphic.DeleteSelected
  66.     END
  67.   END
  68. END HandleMouse;
  69.  
  70. PROCEDURE (f: Frame) Neutralize*;
  71. BEGIN
  72.   f.graphic.Neutralize
  73. END Neutralize;
  74.  
  75. PROCEDURE (f: Frame) Handle* (VAR m: OS.Message);
  76. BEGIN
  77.   WITH m: Shapes0.NotifyChangeMsg DO
  78.     IF f.graphic = m.g THEN f.Draw END
  79.   ELSE
  80.   END
  81. END Handle;
  82.  
  83. PROCEDURE New* (graphic: Shapes0.Graphic): Frame;
  84.   VAR f: Frame;
  85. BEGIN
  86.   NEW(f); f.graphic := graphic; f.orgX := 0; f.orgY := 0; RETURN f
  87. END New;
  88.  
  89. PROCEDURE (f: Frame) Copy* (): Viewers0.Frame;
  90.   VAR f1: Frame;
  91. BEGIN
  92.   f1 := New(f.graphic); f1.orgX := f.orgX; f1.orgY := f.orgY; RETURN f1
  93. END Copy;
  94.  
  95. END GraphicFrames0.
  96.